import { login, getUserInfo, getUserInfoById } from '@/api/user.js'
// 引入封装处理cookies的文件
import { setToken, getToken, removeToken, setTokenTime } from '@/utils/auth.js'

const state = {
  // 设置token初始状态   token持久化 => 放到缓存中
  token: getToken(),
  // 用户信息
  userInfo: {}
}
const mutations = {
  // 设置token
  initToken(state, payload) {
    state.token = payload
    // vuex和 缓存数据的同步
    setToken(payload)
  },
  // 设置用户信息
  initUserInfo(state, payload) {
    // 用浅拷贝的方式去赋值对象,因为这样数据更新之后，才会触发组件的更新
    state.userInfo = { ...payload }
  },
  // 退出登录
  logout(state) {
    state.token = null
    state.userInfo = {}
    removeToken()
  }
}
const actions = {
  // ^登录
  async login(context, payload) {
    // 正常流程
    /* const res = await login(payload)
    console.log(res)
    if (res.data.success) {
      context.commit('initToken', res.data.data)
    } */
    // 经过响应拦截器的处理之后 这里的res实际上就是返回的data，也就是token
    const res = await login(payload)
    // 存储登录的时间戳
    setTokenTime()
    // console.log(res)
    context.commit('initToken', res)
  },
  // ^获取用户资料
  async getUserInfo(context) {
    const res = await getUserInfo()
    // console.log(res)
    // ^根据id获取用户详细资料
    const userInfo = await getUserInfoById(res.userId)
    // console.log(userInfo)
    // 把res、userInfo数据进行合并
    // context.commit('initUserInfo', res)
    context.commit('initUserInfo', { ...res, ...userInfo })
    // 在permission.js中，  async 函数所return的内容 用 await就可以接收到
    return res
  }
}
const getters = {}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}
